package l1j.server.server.templates;

import java.io.Serializable;
import java.sql.Timestamp;

public abstract class L1Item implements Cloneable, Serializable {

	private static final long serialVersionUID = 1L;

	private int _type2; // ● 0=L1EtcItem, 1=L1Weapon, 2=L1Armor
	private int _itemId; // ● アイテムＩＤ

	private String _name; // ● アイテム名

	/** 賭肥肥 40308 */
	private String _ticketName;

	private String _unidentifiedNameId; // ● 未鑑定アイテムのネームＩＤ

	private String _identifiedNameId; // ● 鑑定済みアイテムのネームＩＤ

	private int _type; // ● 詳細なタイプ

	private int _type1; // ● タイプ

	private int _material; // ● 素材

	// TODO 裝飾品鑑定グレード表示實裝byl1j-jp2日方團隊
	private int _grade; // グレード

	private int _weight; // ● 重量

	private int _gfxId; // ● インベントリ内のグラフィックＩＤ

	private int _groundGfxId; // ● 地面に置いた時のグラフィックＩＤ
	private int _minLevel; // ● 使用、装備可能最小ＬＶ

	private int _itemDescId;

	private int _maxLevel; // ● 使用、装備可能最大ＬＶ

	private int _bless; // ● 祝福状態

	/**
	 * 裝備武器道具
	 *
	 * @return 0:可交易 1:不可交易
	 */
	private boolean _tradable; // ● トレード可／不可

	/**
	 * 裝備武器道具
	 *
	 * @return 0:可刪除 1:不可刪除
	 */
	private boolean _cantDelete; // ● 削除不可

	private boolean _save_at_once;

	private int _dmgSmall = 0; // ● 最小ダメージ

	private int _dmgLarge = 0; // ● 最大ダメージ

	private int _safeEnchant = 0; // ● ＯＥ安全圏

	private boolean _useRoyal = false; // ● ロイヤルクラスが装備できるか

	private boolean _useKnight = false; // ● ナイトクラスが装備できるか

	private boolean _useElf = false; // ● エルフクラスが装備できるか

	private boolean _useMage = false; // ● メイジクラスが装備できるか

	private boolean _useDarkelf = false; // ● ダークエルフクラスが装備できるか

	private boolean _useDragonknight = false; // ● ドラゴンナイト裝備できるか
	private boolean _useIllusionist = false; // ● イリュージョニスト裝備できるか

	private byte _addstr = 0; // ● ＳＴＲ補正

	private byte _adddex = 0; // ● ＤＥＸ補正

	private byte _addcon = 0; // ● ＣＯＮ補正

	private byte _addint = 0; // ● ＩＮＴ補正

	private byte _addwis = 0; // ● ＷＩＳ補正

	private byte _addcha = 0; // ● ＣＨＡ補正

	private int _addhp = 0; // ● ＨＰ補正

	private int _addmp = 0; // ● ＭＰ補正

	private int _addhpr = 0; // ● ＨＰＲ補正

	private int _addmpr = 0; // ● ＭＰＲ補正

	private int _addsp = 0; // ● ＳＰ補正

	private int _mdef = 0; // ● ＭＲ

	private boolean _isHasteItem = false; // ● ヘイスト効果の有無

	private int _maxUseTime = 0; // ● 使用可能な時間

	private int _useType;

	private int _foodVolume;

	private boolean _broad; // eboy-DB化掉寶公告

	/**
	 * 道具天數刪除系統。
	 */
	private int _delete_day = 0; // ● 指定天數

	private Timestamp _delete_date; // ● 指定日期

	// opqlo 額外攻擊力
	private int _extradmg;

	// opqlo 額外攻擊力
	// opqlo 額外防禦力
	private int _extradef;

	/** opqlo 掉寶率 */

	private double _droprate;

	public L1Item() {
	}

	public void addDroprate(final double i) {
		this._droprate += i / 100;
	}

	@Override
	public Object clone() {
		try {
			return super.clone();
		} catch (final CloneNotSupportedException e) {
			// throw (new InternalError(e.getMessage()));
			return null;
		}
	}

	// ■■■■■■ L1EtcItem,L1Weapon,L1Armor に共通する項目 ■■■■■■

	// ■■■■■■ L1Armor でオーバーライドする項目 ■■■■■■
	public int get_ac() {
		return 0;
	}

	public byte get_addcha() {
		return this._addcha;
	}

	public byte get_addcon() {
		return this._addcon;
	}

	public byte get_adddex() {
		return this._adddex;
	}

	public int get_addhp() {
		return this._addhp;
	}

	public int get_addhpr() {
		return this._addhpr;
	}

	public byte get_addint() {
		return this._addint;
	}

	// ■■■■■■ L1EtcItem,L1Weapon に共通する項目 ■■■■■■

	public int get_addmp() {
		return this._addmp;
	}

	public int get_addmpr() {
		return this._addmpr;
	}

	public int get_addsp() {
		return this._addsp;
	}

	public byte get_addstr() {
		return this._addstr;
	}

	public byte get_addwis() {
		return this._addwis;
	}

	public int get_canbedmg() {
		return 0;
	}

	// ■■■■■■ L1EtcItem,L1Armor に共通する項目 ■■■■■■

	// ■■■■■■ L1Weapon,L1Armor に共通する項目 ■■■■■■

	public int get_defense_earth() {
		return 0;
	}

	public int get_defense_fire() {
		return 0;
	}

	public int get_defense_water() {
		return 0;
	}

	public int get_defense_wind() {
		return 0;
	}

	public int get_delayid() {
		return 0;
	}

	public int get_delaytime() {
		return 0;
	}

	public int get_locx() {
		return 0;
	}

	public int get_locy() {
		return 0;
	}

	public short get_mapid() {
		return 0;
	}

	public int get_mdef() {
		return this._mdef;
	}

	public int get_regist_blind() {
		return 0;
	}

	public int get_regist_freeze() {
		return 0;
	}

	public int get_regist_sleep() {
		return 0;
	}

	public int get_regist_stone() {
		return 0;
	}

	public int get_regist_stun() {
		return 0;
	}

	public int get_regist_sustain() {
		return 0;
	}

	public int get_safeenchant() {
		return this._safeEnchant;
	}

	public int getBless() {
		return this._bless;
	}

	public int getBowDmgModifierByArmor() {
		return 0;
	}

	public int getBowHitModifierByArmor() {
		return 0;
	}

	public boolean getBroad() {
		return this._broad; // eboy-DB化掉寶公告
	}

	public int getDamageReduction() {
		return 0;
	}

	public Timestamp getDelete_Date() {
		return this._delete_date;
	}

	public int getDelete_Day() {
		return this._delete_day;
	}

	public int getDmgLarge() {
		return this._dmgLarge;
	}

	public int getDmgModifier() {
		return 0;
	}

	public int getDmgModifierByArmor() {
		return 0;
	}

	public int getDmgSmall() {
		return this._dmgSmall;
	}

	public int getDoubleDmgChance() {
		return 0;
	}

	public double getDroprate() {

		return this._droprate;

	}

	public int getExtraDef() {
		return this._extradef;
	}

	public int getExtraDmg() {
		return this._extradmg;
	}

	/**
	 * 肉などのアイテムに設定されている満腹度を返す。
	 */
	public int getFoodVolume() {
		return this._foodVolume;
	}

	public int getGfxId() {
		return this._gfxId;
	}

	/**
	 * グレードを返す
	 *
	 * @return -1:無 0:上等 1:中等 2:初等 3:特等
	 */
	public int getGrade() {
		return this._grade;
	}

	public int getGroundGfxId() {
		return this._groundGfxId;
	}

	public int getHitModifier() {
		return 0;
	}

	public int getHitModifierByArmor() {
		return 0;
	}

	public String getIdentifiedNameId() {
		return this._identifiedNameId;
	}

	/**
	 * 鑑定時に表示されるItemDesc.tblのメッセージIDを返す。
	 */
	public int getItemDescId() {
		return this._itemDescId;
	}

	public int getItemId() {
		return this._itemId;
	}

	/**
	 * ランプなどの燃料の量を返す。
	 */
	public int getLightFuel() {
		if (this._itemId == 40001) { // ランプ
			return 6000;
		} else if (this._itemId == 40002) { // ランタン
			return 12000;
		} else if (this._itemId == 40003) { // ランタンオイル
			return 12000;
		} else if (this._itemId == 40004) { // マジックランタン
			return 0;
		} else if (this._itemId == 40005) { // キャンドル
			return 600;
		} else {
			return 0;
		}
	}

	/**
	 * ランプなどのアイテムに設定されている明るさを返す。
	 */
	public int getLightRange() {
		if (this._itemId == 40001) { // ランプ
			return 11;
		} else if (this._itemId == 40002) { // ランタン
			return 14;
		} else if (this._itemId == 40004) { // マジックランタン
			return 14;
		} else if (this._itemId == 40005) { // キャンドル
			return 8;
		} else {
			return 0;
		}
	}

	public int getMagicDmgModifier() {
		return 0;
	}

	/**
	 * アイテムの素材を返す
	 *
	 *
	 * @return 0=無、 1=液體、2=蠟燭(網)、3=植物、4=動物、5=紙張、6=布、7=皮革、8=木頭、9=骨頭、10=龍鱗、
	 *         11=鐵、12=鋼、13=銅、14=銀、15=金、16=白金、17=米索莉、18=黑色米索莉、19=玻璃、20=寶石、
	 *         21=礦物、22=奧里哈魯根
	 */

	public int getMaterial() {
		return this._material;
	}

	public int getMaxChargeCount() {
		return 0;
	}

	public int getMaxLevel() {
		return this._maxLevel;
	}

	public int getMaxUseTime() {
		return this._maxUseTime;
	}

	public int getMinLevel() {
		return this._minLevel;
	}

	public String getName() {
		return this._name;
	}

	// ■■■■■■ L1Weapon でオーバーライドする項目 ■■■■■■
	public int getRange() {
		return 0;
	}

	public String getTicketName() {
		return this._ticketName;
	}

	/**
	 * アイテムの種類を返す。<br>
	 *
	 * @return <p>
	 *         [etcitem]<br>
	 *         0:arrow, 1:wand, 2:light, 3:gem, 4:totem, 5:firecracker,
	 *         6:potion, 7:food, 8:scroll, 9:questitem, 10:spellbook,
	 *         11:petitem, 12:other, 13:material, 14:event, 15:sting
	 *         16:treasure_box, 17:magic_doll, 18:ItemSummon, 19:teleport_scroll
	 *         20:quest
	 *         </p>
	 *         <p>
	 *         [weapon]<br>
	 *         1:sword, 2:dagger, 3:tohandsword, 4:bow, 5:spear, 6:blunt,
	 *         7:staff, 8:throwingknife, 9:arrow, 10:gauntlet, 11:claw,
	 *         12:edoryu, 13:singlebow, 14:singlespear, 15:tohandblunt,
	 *         16:tohandstaff, 17:kiringku 18chainsword
	 *         </p>
	 *         <p>
	 *         [armor]<br>
	 *         1:helm, 2:armor, 3:T, 4:cloak, 5:glove, 6:boots, 7:shield,
	 *         8:amulet, 9:ring, 10:belt, 11:ring2, 12:earring, 13:guarder,
	 *         14:runeword_left, 15:runeword_right, 16:runeword_middle,
	 *         17:runeword_l_d, 18:runeword_r_d
	 */
	public int getType() {
		return this._type;
	}

	/**
	 * アイテムの種類を返す。<br>
	 *
	 * @return <p>
	 *         [weapon]<br>
	 *         sword:4, dagger:46, tohandsword:50, bow:20, blunt:11, spear:24,
	 *         staff:40, throwingknife:2922, arrow:66, gauntlet:62, claw:58,
	 *         edoryu:54, singlebow:20, singlespear:24, tohandblunt:11,
	 *         tohandstaff:40, kiringku:58, chainsword:24
	 *         </p>
	 */
	public int getType1() {
		return this._type1;
	}

	/**
	 * @return 0 if L1EtcItem, 1 if L1Weapon, 2 if L1Armor
	 */
	public int getType2() {
		return this._type2;
	}

	public String getUnidentifiedNameId() {
		return this._unidentifiedNameId;
	}

	/**
	 * 使用したときのリアクションを決定するタイプを返す。
	 * "ElixirStats"=(-9)萬能藥水
"dice"=(-8)魔法骰子
"magic_doll"=(-7)魔法娃娃
"pet_collar"=(-6)寵物項圈
"light"=(-5)照明類
"food"=(-4)肉類(飽食度物品)
"furniture"=(-3)家具
"hpr"=(-2) 恢復類道具
"none"=(-1) 使用不可能
"normal"=(0)
"weapon"=(1)
"armor"=(2)
"wand1"=(3)
"wand"=(4)ワンドを振るアクションをとる(C_RequestExtraCommandが送られる)
"spell_long"=(5)  地面 / オブジェクト選択(遠距離)
"ntele"=(6)
"identify"=(7)
"res"=(8)
"letter"=(12)
"letter_w"=(13)
"choice"=(14)
"instrument"=(15)
"sosc"=(16)
"spell_short"=(17)  地面 / オブジェクト選択(近距離)
"T"=(18)
"cloak"=(19)
"glove"=(20)
"boots"=(21)
"helm"=(22)
"ring"=(23)
"amulet"=(24)
"shield"=(25)
"guarder"=(25)
"dai"=(26)
"zel"=(27)
"blank"=(28)
"btele"=(29)
"spell_buff"=(30)  オブジェクト選択(遠距離)Ctrlを押さないとパケットが飛ばない？
"ccard"=(31)
"ccard_w"=(32)
"vcard"=(33)
"vcard_w"=(34)
"wcard"=(35)
"wcard_w"=(36)
"belt"=(37)
"spell_long2"=(39)  地面 / オブジェクト選択(遠距離)5と同じ？
"earring"=(40)
"fishing_rod"=(42)
"runeword_left"=(43)TODO 右
"runeword_right"=(44)TODO 左
"runeword_middle"=(45)TODO 中
"del"=(46)
"runeword_r_d"=(47)TODO 輔助左下
"runeword_l_d"=(48)TODO 輔助右下
	 */
	public int getUseType() {
		return this._useType;
	}

	public int getWeight() {
		return this._weight;
	}

	public int getWeightReduction() {
		return 0;
	}

	public boolean isCanSeal() {
		return false;
	}

	public boolean isCantDelete() {
		return this._cantDelete;
	}

	public boolean isHasteItem() {
		return this._isHasteItem;
	}

	// ■■■■■■ L1EtcItem でオーバーライドする項目 ■■■■■■
	public boolean isStackable() {
		return false;
	}

	/**
	 * アイテムの個数が変化した際にすぐにDBに書き込むべきかを返す。
	 */
	public boolean isToBeSavedAtOnce() {
		return this._save_at_once;
	}

	public boolean isTradable() {
		return this._tradable;
	}

	public boolean isTwohandedWeapon() {
		return false;
	}

	public boolean isUseDarkelf() {
		return this._useDarkelf;
	}

	public boolean isUseDragonknight() {
		return this._useDragonknight;
	}

	public boolean isUseElf() {
		return this._useElf;
	}

	public boolean isUseIllusionist() {
		return this._useIllusionist;
	}

	public boolean isUseKnight() {
		return this._useKnight;
	}

	public boolean isUseMage() {
		return this._useMage;
	}

	public boolean isUseRoyal() {
		return this._useRoyal;
	}

	public void set_addcha(final byte addcha) {
		this._addcha = addcha;
	}

	public void set_addcon(final byte addcon) {
		this._addcon = addcon;
	}

	public void set_adddex(final byte adddex) {
		this._adddex = adddex;
	}

	public void set_addhp(final int addhp) {
		this._addhp = addhp;
	}

	public void set_addhpr(final int addhpr) {
		this._addhpr = addhpr;
	}

	public void set_addint(final byte addint) {
		this._addint = addint;
	}

	public void set_addmp(final int addmp) {
		this._addmp = addmp;
	}

	public void set_addmpr(final int addmpr) {
		this._addmpr = addmpr;
	}

	public void set_addsp(final int addsp) {
		this._addsp = addsp;
	}

	public void set_addstr(final byte addstr) {
		this._addstr = addstr;
	}

	public void set_addwis(final byte addwis) {
		this._addwis = addwis;
	}

	public void set_mdef(final int i) {
		this._mdef = i;
	}

	public void set_safeenchant(final int safeenchant) {
		this._safeEnchant = safeenchant;
	}

	public void setBless(final int i) {
		this._bless = i;
	}

	public void setBroad(final boolean i) {
		this._broad = i;
	}

	public void setCantDelete(final boolean flag) {
		this._cantDelete = flag;
	}

	public void setDelete_Date(final Timestamp time) {
		this._delete_date = time;
	}

	public void setDelete_Day(final int i) {
		this._delete_day = i;
	}

	public void setDmgLarge(final int dmgLarge) {
		this._dmgLarge = dmgLarge;
	}

	public void setDmgSmall(final int dmgSmall) {
		this._dmgSmall = dmgSmall;
	}

	public void setExtraDef(final int i) {
		this._extradef = i;
	}

	// opqlo 額外防禦力

	public void setExtraDmg(final int i) {
		this._extradmg = i;
	}

	public void setFoodVolume(final int volume) {
		this._foodVolume = volume;
	}

	public void setGfxId(final int gfxId) {
		this._gfxId = gfxId;
	}

	public void setGrade(final int grade) {
		this._grade = grade;
	}

	// TODO 裝飾品鑑定グレード表示實裝byl1j-jp2日方團隊

	public void setGroundGfxId(final int groundGfxId) {
		this._groundGfxId = groundGfxId;
	}

	public void setHasteItem(final boolean flag) {
		this._isHasteItem = flag;
	}

	public void setIdentifiedNameId(final String identifiedNameId) {
		this._identifiedNameId = identifiedNameId;
	}

	public void setItemDescId(final int descId) {
		this._itemDescId = descId;
	}

	public void setItemId(final int itemId) {
		this._itemId = itemId;
	}

	public void setMaterial(final int material) {
		this._material = material;
	}

	public void setMaxLevel(final int maxlvl) {
		this._maxLevel = maxlvl;
	}

	public void setMaxUseTime(final int i) {
		this._maxUseTime = i;
	}

	public void setMinLevel(final int level) {
		this._minLevel = level;
	}

	public void setName(final String name) {
		this._name = name;
	}

	public void setTicketName(final String name) {
		this._ticketName = name;
	}

	public void setToBeSavedAtOnce(final boolean flag) {
		this._save_at_once = flag;
	}

	public void setTradable(final boolean flag) {
		this._tradable = flag;
	}

	public void setType(final int type) {
		this._type = type;
	}

	public void setType1(final int type1) {
		this._type1 = type1;
	}

	public void setType2(final int type) {
		this._type2 = type;
	}

	public void setUnidentifiedNameId(final String unidentifiedNameId) {

		this._unidentifiedNameId = unidentifiedNameId;
	}

	public void setUseDarkelf(final boolean flag) {
		this._useDarkelf = flag;
	}

	public void setUseDragonknight(final boolean flag) {
		this._useDragonknight = flag;
	}

	public void setUseElf(final boolean flag) {
		this._useElf = flag;
	}

	public void setUseIllusionist(final boolean flag) {
		this._useIllusionist = flag;
	}

	public void setUseKnight(final boolean flag) {
		this._useKnight = flag;
	}

	public void setUseMage(final boolean flag) {
		this._useMage = flag;
	}

	public void setUseRoyal(final boolean flag) {
		this._useRoyal = flag;
	}

	public void setUseType(final int useType) {
		this._useType = useType;
	}

	public void setWeight(final int weight) {
		this._weight = weight;
	}

	/** opqlo 掉寶率 */

}
